#include <stdio.h>
#include <fcntl.h>    /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <mqueue.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

FILE *data_output_file;
char buf[50];
mqd_t motor_data_queue;


//若接收到SIGINT（ctrl+c的中断信号），则先删除消息队列，再退出程序。
void sigint_routine(int signo)
{
    mq_close(motor_data_queue);
    mq_unlink("/motor_data");
    exit(0);
}

int main()
{
    //创建消息队列，队列大小为100，每条消息的长度为50
    struct mq_attr attr = {0};
    attr.mq_maxmsg = 100;
    attr.mq_msgsize = 50;
    motor_data_queue = mq_open("/motor_data", O_RDONLY | O_CREAT, 0666, &attr);
    if(motor_data_queue == -1)
    {
        perror("mq_open");
        exit(-1);
    }
    //修改SIGINT信号的处理方式，当使用ctrl+c终止进程时，先删除消息队列
    signal(SIGINT, sigint_routine);
    while (1)
    {
        //接收一条消息，若消息队列为空，则阻塞进程
        mq_receive(motor_data_queue, buf, sizeof(buf), NULL);
        //printf("%d %s", receive_number, buf);
        //如果接收到的消息为"open"命令，则打开一个文件
        if(strncmp(buf, "open ", 5) == 0)
        {
            //mq_receive(motor_data_queue, buf, sizeof(buf), NULL);
            data_output_file = fopen(buf + 5, "w");
            printf("data_recorder: opening %s\n", buf + 5);
        }
        //如果接收到的消息为"close"命令，则关闭一个文件
        else if(strcmp(buf, "close") == 0)
        {
            fclose(data_output_file);
            printf("data_recorder: closing file\n");
        }
        //如果接收到的消息为其他，且已经打开文件，则向文件写入数据
        else if(data_output_file != NULL)
        {
            fwrite(buf, sizeof(char), strlen(buf), data_output_file);
        }
    }
    mq_unlink("/motor_data");
    mq_close(motor_data_queue);
    return 0;
}